const getBaseURL = () => {
  console.log('获取基础URL，环境:', process.env.NODE_ENV);
  // 开发环境使用localhost，生产环境可从配置中读取
  return process.env.NODE_ENV === "development"
    ? "http://localhost:3000/api"
    : "http://192.168.0.154:3000/api";
};

// 封装的request函数
function request(options) {
  console.log('发起请求:', options.url);
  // 从存储中获取accessToken和refreshToken
  const token = uni.getStorageSync("accessToken");
  const refreshToken = uni.getStorageSync("refreshToken");

  console.log('token存在:', !!token);
  console.log('refreshToken存在:', !!refreshToken);

  // 设置默认header
  options.header = options.header || {};
  options.header["Content-Type"] = 
    options.header["Content-Type"] || "application/json";

  // 如果存在token，添加到header
  if (token) {
    options.header["Authorization"] = `Bearer ${token}`;
  }

  // 拼接完整的URL
  const fullUrl = getBaseURL() + options.url;
  console.log('完整请求URL:', fullUrl);
  options.url = fullUrl;

  // 返回Promise对象，便于使用async/await
  return new Promise((resolve, reject) => {
    options.success = (res) => {
      console.log('请求成功，状态码:', res.statusCode);
      if (res.statusCode >= 200 && res.statusCode < 400) {
        resolve(res.data);
      } else if (res.statusCode === 401 && refreshToken) {
        console.log('401错误，尝试刷新token');
        // 访问令牌过期，尝试使用刷新令牌获取新的访问令牌
        refreshAccessToken(refreshToken)
          .then((newTokenData) => {
            console.log('刷新token成功');
            // 更新存储中的token
            uni.setStorageSync("accessToken", newTokenData.token);

            // 如果刷新令牌也更新了，一并保存
            if (newTokenData.refreshToken) {
              uni.setStorageSync("refreshToken", newTokenData.refreshToken);
            }

            // 重新发送原请求
            options.header["Authorization"] = `Bearer ${newTokenData.token}`;
            sendRequest(options).then(resolve).catch(reject);
          })
          .catch((err) => {
            console.error('刷新token失败:', err);
            // 刷新令牌也失败，跳转到登录页
            uni.removeStorageSync("token");
            uni.removeStorageSync("refreshToken");
            uni.redirectTo({ url: "/pages/login/login" });
            reject(err);
          });
      } else {
        console.error('请求失败，状态码:', res.statusCode);
        reject(res);
      }
    };

    options.fail = (err) => {
      console.error('请求网络错误:', err);
      reject(err);
    };

    uni.request(options);
  });
}

// 刷新访问令牌的方法
function refreshAccessToken(refreshToken) {
  return new Promise((resolve, reject) => {
    uni.request({
      url: getBaseURL() + "/auth/refresh-token",
      method: "POST",
      data: { refreshToken },
      header: {
        "Content-Type": "application/json",
      },
      success: (res) => {
        if (res.statusCode === 200 && res.data.token) {
          resolve(res.data);
        } else {
          reject(res);
        }
      },
      fail: (err) => {
        reject(err);
      },
    });
  });
}

// 用于重新发送请求的辅助方法
function sendRequest(options) {
  return new Promise((resolve, reject) => {
    const newOptions = { ...options };

    newOptions.success = (res) => {
      if (res.statusCode >= 200 && res.statusCode < 400) {
        resolve(res.data);
      } else {
        reject(res);
      }
    };

    newOptions.fail = (err) => {
      reject(err);
    };

    uni.request(newOptions);
  });
}

export default request;
